home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 18 / CU Amiga Magazine's Super CD-ROM 18 (1997)(EMAP Images)(GB)[!][issue 1998-01].iso / CUCD / Programming / AmigaE / Src / OOmodules / list / queuestack.e < prev   
Encoding:
Text File  |  1995-09-10  |  8.5 KB  |  382 lines

  1. OPT MODULE
  2.  
  3. MODULE 'oomodules/object'
  4.  
  5. EXPORT OBJECT qsnode OF object
  6.  right:PTR TO qsnode
  7.  left:PTR TO qsnode
  8.  item
  9. ENDOBJECT
  10.  
  11. EXPORT OBJECT queuestack OF object
  12.  baditem
  13.  mysize
  14.  last:PTR TO qsnode
  15.  first:PTR TO qsnode
  16. ENDOBJECT
  17.  
  18. DEF tmp:PTR TO qsnode,moo:PTR TO LONG
  19. EXPORT DEF ctrlc
  20.  
  21. EXPORT PROC name() OF qsnode IS 'QSNode'
  22.  
  23. EXPORT PROC size() OF qsnode IS 16
  24.  
  25. EXPORT PROC select(opts,i) OF qsnode
  26.  DEF item
  27.  item:=ListItem(opts,i)
  28.  SELECT item
  29.   CASE "set"
  30.    INC i
  31.    self.item:=ListItem(opts,i)
  32.  ENDSELECT
  33. ENDPROC i
  34.  
  35. EXPORT PROC inject(proc,item) OF qsnode
  36.  self.item:=proc(self.item,item)
  37.  IF ctrlc AND CtrlC() THEN Raise("^C")
  38.  IF self.right THEN self.right.inject(proc,self.item)
  39. ENDPROC
  40.  
  41. EXPORT PROC injectBackwards(proc,item) OF qsnode
  42.  self.item:=proc(self.item,item)
  43.  IF ctrlc AND CtrlC() THEN Raise("^C")
  44.  IF self.left THEN self.left.injectBackwards(proc,self.item)
  45. ENDPROC
  46.  
  47. EXPORT PROC do(proc) OF qsnode
  48.  proc(self.item)
  49.  IF ctrlc AND CtrlC() THEN Raise("^C")
  50.  IF self.right THEN self.right.do(proc)
  51. ENDPROC
  52.  
  53. EXPORT PROC doBackwards(proc) OF qsnode
  54.  proc(self.item)
  55.  IF ctrlc AND CtrlC() THEN Raise("^C")
  56.  IF self.left THEN self.left.doBackwards(proc)
  57. ENDPROC
  58.  
  59. EXPORT PROC collect(proc,add:PTR TO queuestack) OF qsnode
  60.  add.addLast(proc(self.item))
  61.  IF ctrlc AND CtrlC() THEN Raise("^C")
  62.  IF self.right THEN self.right.collect(proc,add)
  63. ENDPROC
  64.  
  65. EXPORT PROC collectBackwards(proc,add:PTR TO queuestack) OF qsnode
  66.  add.addLast(proc(self.item))
  67.  IF ctrlc AND CtrlC() THEN Raise("^C")
  68.  IF self.left THEN self.left.collectBackwards(proc,add)
  69. ENDPROC
  70.  
  71. EXPORT PROC conform(proc) OF qsnode
  72.  IF ctrlc AND CtrlC() THEN Raise("^C")
  73.  RETURN IF self.right THEN self.right.conform(proc) AND proc(self.item) ELSE proc(self.item)
  74. ENDPROC
  75.  
  76. EXPORT PROC detect(proc,baditem) OF qsnode
  77.  IF ctrlc AND CtrlC() THEN Raise("^C")
  78.  RETURN IF proc(self.item) THEN self.item ELSE IF self.right THEN self.right.detect(proc,baditem) ELSE baditem
  79. ENDPROC
  80.  
  81. EXPORT PROC detectBackwards(proc,baditem) OF qsnode
  82.  IF ctrlc AND CtrlC() THEN Raise("^C")
  83.  RETURN IF proc(self.item) THEN self.item ELSE IF self.left THEN self.left.detectBackwards(proc,baditem) ELSE baditem
  84. ENDPROC
  85.  
  86. EXPORT PROC reject(proc,add:PTR TO queuestack) OF qsnode
  87.  IF ctrlc AND CtrlC() THEN Raise("^C")
  88.  IF proc(self.item)<>TRUE
  89.   add.addLast(self.item)
  90.  ENDIF
  91.  IF self.right THEN self.right.reject(proc,add)
  92. ENDPROC
  93.  
  94. EXPORT PROC rejectBackwards(proc,add:PTR TO queuestack) OF qsnode
  95.  IF ctrlc AND CtrlC() THEN Raise("^C")
  96.  IF proc(self.item)<>TRUE
  97.   add.addLast(self.item)
  98.  ENDIF
  99.  IF self.left THEN self.left.rejectBackwards(proc,add)
  100. ENDPROC
  101.  
  102. EXPORT PROC choose(proc,add:PTR TO queuestack) OF qsnode
  103.  IF ctrlc AND CtrlC() THEN Raise("^C")
  104.  IF proc(self.item)
  105.   add.addLast(self.item)
  106.  ENDIF
  107.  IF self.right THEN self.right.choose(proc,add)
  108. ENDPROC
  109.  
  110. EXPORT PROC chooseBackwards(proc,add:PTR TO queuestack) OF qsnode
  111.  IF ctrlc AND CtrlC() THEN Raise("^C")
  112.  IF proc(self.item)
  113.   add.addLast(self.item)
  114.  ENDIF
  115.  IF self.left THEN self.left.choose(proc,add)
  116. ENDPROC
  117.  
  118. EXPORT PROC end() OF qsnode
  119.  tmp:=self.right
  120.  IF tmp THEN END tmp
  121. ENDPROC
  122.  
  123. EXPORT PROC size() OF queuestack IS 20
  124.  
  125. EXPORT PROC name() OF queuestack IS 'QueueStack'
  126.  
  127. EXPORT PROC select(opts,i) OF queuestack
  128.  DEF item
  129.  item:=ListItem(opts,i)
  130.  SELECT item
  131.   CASE "bad"
  132.    INC i
  133.    self.baditem:=ListItem(opts,i)
  134.   CASE "set"
  135.    INC i
  136.    self.set(ListItem(opts,i))
  137.  ENDSELECT
  138. ENDPROC i
  139.  
  140. EXPORT PROC set(item) OF queuestack
  141.  IF (item = self.baditem) AND (self.first = NIL) THEN RETURN
  142.  IF self.first = NIL
  143.   self.first := NEW tmp.new(["set",item])
  144.   self.mysize := 1
  145.   self.last:=self.first
  146.  ELSE
  147.   tmp:=self.first
  148.   END tmp
  149.   self.first:=0
  150.   self.last:=0
  151.  ENDIF
  152. ENDPROC
  153.  
  154. EXPORT PROC addFirst(item) OF queuestack
  155.  IF item = self.baditem THEN RETURN self.error({baditem})
  156.  self.mysize:=self.mysize+1
  157.  IF self.first = NIL
  158.   self.first:=NEW tmp.new(["set",item])
  159.   self.last:=self.first
  160.  ELSE
  161.   self.first.left := NEW tmp.new(["set",item])
  162.   self.first.left.right:=self.first
  163.   self.first := self.first.left
  164.  ENDIF
  165. ENDPROC
  166.  
  167. EXPORT PROC addLast(item) OF queuestack
  168.  IF item = self.baditem THEN RETURN self.error({baditem})
  169.  self.mysize:=self.mysize+1
  170.  IF self.first = NIL
  171.   self.first:=NEW tmp.new(["set",item])
  172.   self.last:=self.first
  173.  ELSE
  174.   self.last.right := NEW tmp.new(["set",item])
  175.   self.last.right.left:=self.last
  176.   self.last := self.last.right
  177.  ENDIF
  178. ENDPROC
  179.  
  180. EXPORT PROC getFirst() OF queuestack
  181.  DEF out=0
  182.  IF self.mysize
  183.   self.mysize:=self.mysize-1
  184.   out:=self.first.item
  185.   tmp:=self.first
  186.   self.first:=self.first.right
  187.   tmp.right:=0
  188.   END tmp
  189.   IF self.mysize = NIL
  190.    self.first:=NIL
  191.    self.last:=NIL
  192.   ENDIF
  193.  ELSE
  194.   out:=FALSE
  195.   Raise("qstk")
  196.  ENDIF
  197. ENDPROC out
  198.  
  199. EXPORT PROC getLast() OF queuestack
  200.  DEF out=0
  201.  IF self.mysize
  202.   self.mysize:=self.mysize-1
  203.   out:=self.last.item
  204.   tmp:=self.last
  205.   self.last:=self.last.left
  206.   tmp.right := 0
  207.   END tmp
  208.   IF self.mysize = NIL
  209.    self.first:=NIL
  210.    self.last:=NIL
  211.   ENDIF
  212.  ELSE
  213.   out:=FALSE
  214.   Raise("qstk")
  215.  ENDIF
  216. ENDPROC out
  217.  
  218. EXPORT PROC length() OF queuestack IS self.mysize
  219.  
  220. EXPORT PROC addFirstQS(in:PTR TO queuestack) OF queuestack
  221.  IF in.first
  222.   self.first.left:=in.last
  223.   in.last.right:=self.first
  224.   self.mysize := self.mysize + in.mysize
  225.   self.first := in.first
  226.   in.mysize := 0
  227.   in.first := NIL;in.last := NIL
  228.  ENDIF
  229. ENDPROC
  230.  
  231. EXPORT PROC addLastQS(in:PTR TO queuestack) OF queuestack
  232.  IF in.first
  233.   self.last.right:=in.first
  234.   in.first.left:=self.last
  235.   self.last := in.last
  236.   self.mysize := self.mysize + in.mysize
  237.   in.mysize := 0
  238.   in.first := NIL; in.last := NIL
  239.  ENDIF
  240. ENDPROC
  241.  
  242. EXPORT PROC inject(proc,item=0) OF queuestack
  243.  IF self.first THEN RETURN self.first.inject(proc,item)
  244. ENDPROC
  245.  
  246. EXPORT PROC injectBackwards(proc,item=0) OF queuestack
  247.  IF self.last THEN RETURN self.last.injectBackwards(proc,item)
  248. ENDPROC
  249.  
  250. EXPORT PROC do(proc) OF queuestack
  251.  IF self.first THEN self.first.do(proc)
  252. ENDPROC
  253.  
  254. EXPORT PROC doBackwards(proc) OF queuestack
  255.  IF self.last THEN self.last.doBackwards(proc)
  256. ENDPROC
  257.  
  258. EXPORT PROC collect(proc) OF queuestack
  259.  DEF add:PTR TO queuestack
  260.  NEW add.new(["bad",[self.baditem]])
  261.  IF self.first THEN self.first.collect(proc,add)
  262.  RETURN add
  263. ENDPROC
  264.  
  265. EXPORT PROC collectBackwards(proc) OF queuestack
  266.  DEF add:PTR TO queuestack
  267.  NEW add.new(["bad",[self.baditem]])
  268.  IF self.last THEN self.last.collectBackwards(proc,add)
  269.  RETURN add
  270. ENDPROC
  271.  
  272. EXPORT PROC conform(proc) OF queuestack
  273.  RETURN IF self.first THEN self.first.conform(proc) ELSE FALSE
  274. ENDPROC
  275.  
  276. EXPORT PROC detect(proc) OF queuestack
  277.  RETURN IF self.first THEN self.first.detect(proc,self.baditem) ELSE self.baditem
  278. ENDPROC
  279.  
  280. EXPORT PROC detectBackwards(proc) OF queuestack
  281.  RETURN IF self.last THEN self.last.detectBackwards(proc,self.baditem) ELSE self.baditem
  282. ENDPROC
  283.  
  284. EXPORT PROC reject(proc) OF queuestack
  285.  DEF add:PTR TO queuestack
  286.  NEW add
  287.  IF self.first THEN self.first.reject(proc,add)
  288.  RETURN add
  289. ENDPROC
  290.  
  291. EXPORT PROC rejectBackwards(proc) OF queuestack
  292.  DEF add:PTR TO queuestack
  293.  NEW add
  294.  IF self.last THEN self.last.rejectBackwards(proc,add)
  295.  RETURN add
  296. ENDPROC
  297.  
  298. EXPORT PROC choose(proc) OF queuestack
  299.  DEF add:PTR TO queuestack
  300.  NEW add
  301.  IF self.first THEN self.first.choose(proc,add)
  302.  RETURN add
  303. ENDPROC
  304.  
  305. EXPORT PROC chooseBackwards(proc) OF queuestack
  306.  DEF add:PTR TO queuestack
  307.  NEW add
  308.  IF self.last THEN self.last.chooseBackwards(proc,add)
  309.  RETURN add
  310. ENDPROC
  311.  
  312. EXPORT PROC asList() OF queuestack
  313.  moo:=List(self.length())
  314.  self.do({makeList})
  315. ENDPROC moo
  316.  
  317. EXPORT PROC asListBackwards() OF queuestack
  318.  moo:=List(self.length())
  319.  self.doBackwards({makeList})
  320. ENDPROC
  321.  
  322. EXPORT PROC asQueueStack(in) OF queuestack
  323.  DEF i,mytmp
  324.  mytmp:=in
  325.  WHILE mytmp
  326.   FOR i:=0 TO ListLen(mytmp)-1
  327.    IF ListItem(mytmp,i)<>self.baditem THEN self.addLast(ListItem(mytmp,i)) ELSE RETURN self.error({baditem})
  328.   ENDFOR
  329.   mytmp:=Next(mytmp)
  330.  ENDWHILE
  331. ENDPROC
  332.  
  333. EXPORT PROC asQueueStackBackwards(in) OF queuestack
  334.  DEF i,mytmp
  335.  mytmp:=in
  336.  WHILE mytmp
  337.   FOR i:=0 TO ListLen(mytmp)-1
  338.    IF ListItem(mytmp,i)<>self.baditem THEN self.addFirst(ListItem(mytmp,i)) ELSE RETURN self.error({baditem})
  339.   ENDFOR
  340.   mytmp:=Next(mytmp)
  341.   ENDWHILE
  342. ENDPROC
  343.  
  344. EXPORT PROC error(text=0,opt=0) OF queuestack
  345.  SELECT text
  346.   CASE 0
  347.    RETURN FALSE
  348.   CASE {baditem}
  349.    RETURN text
  350.   CASE {queuestackempty}
  351.    RETURN text
  352.   DEFAULT
  353.    RETURN SUPER self.error(text,opt)
  354.  ENDSELECT
  355. ENDPROC
  356.  
  357. EXPORT PROC kill() OF queuestack
  358.  self.do({murder})
  359.  self.end()
  360.  self.first:=0
  361.  self.last:=0
  362.  self.mysize:=0
  363. ENDPROC
  364.  
  365. EXPORT PROC end() OF queuestack
  366.  tmp:=self.first
  367.  END tmp
  368. ENDPROC
  369.  
  370. PROC murder(i)
  371.  END i
  372. ENDPROC
  373.  
  374. PROC makeList(i)
  375.  ListAdd(moo,[i,0],1)
  376. ENDPROC
  377.  
  378. baditem:
  379.  CHAR 'Bad item\n',0
  380. queuestackempty:
  381.  CHAR 'Empty\n',0
  382.